| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263 |
- import { NextRequest, NextResponse } from 'next/server';
- import { getAccessToken } from '@/lib/utils/server';
- const API_URL = process.env.API_URL;
- export async function GET(_: NextRequest, { params }: { params: Promise<{ uuid: string }> })
- {
- const { uuid } = await params;
- try {
- const accessToken = await getAccessToken();
- // 백엔드에서 파일 메타데이터(url, fileName) 조회 + 권한 체크
- const res = await fetch(`${API_URL}/api/forum/comment/file/${uuid}`, {
- cache: 'no-store',
- headers: {
- ...(accessToken ? { 'Authorization': `Bearer ${accessToken}` } : {})
- }
- });
- if (!res.ok) {
- return new NextResponse(null, {
- status: res.status
- });
- }
- const json = await res.json();
- const fileUrl = json?.data?.url;
- const fileName = json?.data?.fileName;
- if (!fileUrl) {
- return new NextResponse(null, { status: 404 });
- }
- // 실제 파일 다운로드 (백엔드 서버에서)
- const fileRes = await fetch(`${API_URL}${fileUrl}`, {
- cache: 'no-store'
- });
- if (!fileRes.ok) {
- return new NextResponse(null, {
- status: fileRes.status
- });
- }
- const contentType = fileRes.headers.get('content-type') || 'application/octet-stream';
- const buffer = await fileRes.arrayBuffer();
- const encodedFileName = encodeURIComponent(fileName || 'download');
- return new NextResponse(buffer, {
- status: 200,
- headers: {
- 'Content-Type': contentType,
- 'Content-Disposition': `attachment; filename*=UTF-8''${encodedFileName}`
- }
- });
- } catch {
- return new NextResponse(null, {
- status: 502
- });
- }
- }
|